//テキストボックスに、郵便番号からの住所検索機能を付加します。
//【使い方】

(function() {  

	jQuery.fn.zipsearch = function(config){
		// 引数のデフォルト値を渡す {}内は、カンマ（,）で区切って複数可能
		config = jQuery.extend({
				zipCdElm: $(this).prevAll("input:first"),		//郵便番号を入力する要素（デフォルト：直前のinput要素）
				//addrElm: $(this).nextAll("input:first"),			//検索結果の住所を表示する要素（デフォルト：直後のinput要素）\
				addrElm: $($("input").get($("input").index($(this))+1)),			//検索結果の住所を表示する要素（デフォルト：直後のinput要素）
				errorElm: $(this).nextAll(".zipCodeError:first"),
				url: "",														//検索実行用のURL（指定必須）
				noResultMessage:"<br/>入力された郵便番号は登録されていません"	//住所が存在しなかった場合に表示する文字列
			},config);
			
		//デフォルト値を上書き
		//config = $.extend({}, $.fn.zipsearch.defaults, config);
		
		config.url = $.fn.zipsearch.defaults.url;
		config.noResultMessage = $.fn.zipsearch.defaults.noResultMessage;

		//機能を付加するボタン
		var target = this;
		//郵便番号入力欄の要素
		var zipCdInput = config.zipCdElm;
		//住所表示対象の要素
		var addrInput = config.addrElm;
		//エラー表示要素
		var errorArea = config.errorElm;
		
		//値が入力されていない場合は、ボタンは押せなくする
		if(zipCdInput.val() == ""){
			target.attr("disabled","disabled");
		}
		
		//入力欄にマスクし、7桁入力時以外検索ボタンを押させない処理をバインドする
		zipCdInput.mask('999-9999',{placeholder:" "});
		
		//7桁入力されないとボタンを押せなくする
		zipCdInput.keyup(function(){
				if(zipCdInput.val().replace(/[-\s]/g, "").length  == 7){
					target.attr("disabled","");
				}else{
					target.attr("disabled","disabled");
					if(addrInput.data("zipsearch_autocompleted")){
						addrInput.unautocomplete();
						addrInput.data("zipsearch_autocompleted", false);
					}
				}
			}
		);
		
		//ボタン押下時のイベントに郵便番号検索処理をバインド
		target.click(function(){
			
			//既にオートコンプリートをバインド済みの場合は削除する。
			if(addrInput.data("zipsearch_autocompleted")){
				addrInput.unautocomplete();
				addrInput.data("zipsearch_autocompleted", false);
			}
			
			//エラーメッセージを削除する
			errorArea.html("");

				$.ajax(
						{
							'url':config.url,
							'async':true,
							'data':
							{
								'convert': 'json',
								'zipCode': zipCdInput.val().replace(/[-\s]/g, "") 
							},
							'success': function(data)
							{
								//候補検索結果をJSONからJSオブジェクトに変換
								var suggest = eval('(' + data + ')');
								
								//データが無かった場合は無いよメッセージ表示
								if(!suggest || suggest.length == 0){
									errorArea.html(config.noResultMessage);
								//一件だけだった場合はそのまま表示
								}else if(suggest.length == 1){
									addrInput.val(suggest[0]);
								//複数件あった場合は候補表示
								}else{
									
									//autocomplete内でsetTimeOutを使っている為、ディレイをかけないとおかしくなる
									setTimeout(function() { addrInput.trigger("focus").trigger("click")}, 50);
									//setTimeout(function() { addrInput.trigger("click")}, 60);
									//一旦入力欄の中身を消す
									addrInput.val("");
									//addrInput.val(suggest[0]);
									//バインド済みのフラグを立てる
									addrInput.data("zipsearch_autocompleted", true);
									addrInput.autocomplete(suggest, {
										minChars: 0,
										autoFill: false,
										mustMatch: false,
										//matchSubset: false,
										//delay:400,
										cacheLength:15,
										matchContains: false});
								}
							}
						});
		});
	};
	
		//上書き可能なデフォルト値を定義
	$.fn.zipsearch.defaults = {
			url: "",														//検索実行用のURL（指定必須）
			noResultMessage:"入力された郵便番号は登録されていません"	//住所が存在しなかった場合に表示する文字列
	}
	
})(jQuery);